package ig.finanzas;



import ig.metrica.escenario.GeneraEscenarioBean;
import ig.util.ejb.IGBean;
import ig.util.ejb.IGEntityBean;

import ig.util.excepciones.DatoInvalidoExcepcion;

import ig.util.excepciones.LogicaExcepcion;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import javax.naming.NamingException;



/**
 *
 * Modela la estructura y comportamiento de las monedas en el sistema.
 *
 * @author lfgarcia
 *
 */

public class MonedaBean extends IGEntityBean {
    
    static final long serialVersionUID = 01;
    
    /**
     *
     * Nombre de la moneda
     *
     * @uml.property  name="nombre"
     *
     */
    
    private String nombre;
    
    /**
     *
     * Registra los valores de la moneda en el tiempo
     *
     * @uml.property  name="valoresRegistrados"
     *
     * @uml.associationEnd
     *
     */
    
    private ManejadorValoresHistoricos valoresRegistrados;
    
    
    
    /**
     *
     * @return  Returns the nombre.
     *
     * @uml.property  name="nombre"
     *
     */
    
    public String getNombre(){
        
        return nombre;
        
    }
    
    
    
    /**
     *
     * Devuelve el valor vigente de la serie de valores a una fecha especifica.
     *
     * @param fecha
     *
     * @return
     *
     * @throws DatoInvalidoExcepcion Si la fecha es nula.
     *
     * @throws LogicaExcepcion Si no hay suficiente informacion para determinar el valor vigente.
     *
     */
    
    public double obtenerValorVigenteA(Date fecha) throws DatoInvalidoExcepcion, LogicaExcepcion{
        
        if (nombre.trim().equals("PESO")|| nombre.trim().equals("PESOS")){
            
            return  1;
            
        }else {
            
            try {
//                System.out.println("fecha:"+fecha);
//                System.out.println(valoresRegistrados==null?"es null":"no es null");
                return valoresRegistrados.obtenerValorVigenteA(fecha, 0);
                
            } catch (DatoInvalidoExcepcion e) {
                
                throw new DatoInvalidoExcepcion(e.toString()+" Error con la moneda + " + nombre +". ");
                
            } catch (LogicaExcepcion e) {
                
                throw new LogicaExcepcion(e.toString()+" Error con la moneda + " + nombre+ ". ");
                
            }
            
        }
        
    }
    
    
    
    /**
     *
     * Devuelve el cambio esperado en la serie de valores calculado a partir de la forma en que lo
     *
     * especifique el DefinidorCalculoCambioEsperado.
     *
     * @param fecha
     *
     * @param definidor
     *
     * @return
     *
     * @throws DatoInvalidoExcepcion Si alguno de los parametros recibidos es invalido.
     *
     * @throws LogicaExcepcion Si no se puede determinar el valor del cambio esperado.
     *
     */
    
    public double cambioEsperadoValoresRegistrados(Date fecha, DefinidorCalculoCambioEsperado definidor) throws DatoInvalidoExcepcion, LogicaExcepcion{
        
        try{
            
            return valoresRegistrados.cambioEsperado(fecha, definidor,true);
            
        } catch (DatoInvalidoExcepcion e) {
            
            throw new DatoInvalidoExcepcion(e.toString()+" Error con la moneda + " + nombre +". ");
            
        } catch (LogicaExcepcion e) {
            
            throw new LogicaExcepcion(e.toString()+" Error con la moneda + " + nombre+ ". ");
            
        }
        
    }
    
    
    
    public void eliminarEntidad(){}
    
    
    
    public void actualizarEntidad(){}
    
    
    
    public void cargarEntidad() throws NamingException, SQLException, DatoInvalidoExcepcion{
        ResultSet rs = null;
        try {
            try {valoresRegistrados = new MVHSimple();} catch (DatoInvalidoExcepcion e) {}
            conn = IGBean.getMetricaDB();//getConexion("METRICADB");
            try {pstmt1.close();} catch (Exception e) {}
            pstmt1=null;
            pstmt1 = conn.prepareStatement(
                    "SELECT FECHA, VALOR " +
                    "FROM VALORESMONEDAS " +
                    "WHERE IDMONEDA=? ");
            pstmt1.setLong(1, pk.getIdInterna());
            rs = pstmt1.executeQuery();
            
            while(rs.next()){
                java.sql.Date fecha = rs.getDate("FECHA");
                double[] valor = new double[1];
                valor[0]=rs.getDouble("VALOR");
                valoresRegistrados.adicionarValor(fecha, valor);
            }
        } catch (DatoInvalidoExcepcion e) {
            e.printStackTrace();
            throw e;
        } catch (SQLException e) {
            e.printStackTrace();
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
            throw new DatoInvalidoExcepcion(e.toString());
        }finally{
            //try {conn.close();} catch (Exception e) {}
            try {pstmt1.close();pstmt1=null;} catch (Exception e) {}
            try {rs.close();} catch (Exception e) {}
        }
    }
    
    
    
    public MonedaBean ejbFindByPrimaryKey(MonedaPK key) throws Exception{
        ResultSet rs = null;
        try{
            conn =IGBean.getMetricaDB();// getConexion("METRICADB");
            pstmt1 = conn.prepareStatement(
                    "SELECT ID, NOMBRE " +
                    "FROM MONEDAS " +
                    "WHERE NOMBRE=?");
            pstmt1.setString(1, key.getNombre());
            rs = pstmt1.executeQuery();
            if (rs.next()==false)
                throw new Exception("No fue posible encontrar la moneda " + key.toString());
            
            this.nombre = rs.getString("NOMBRE");
            pk = new MonedaPK(this.nombre);
            pk.setIdInterna(rs.getInt("ID"));
            try{pstmt1.close();pstmt1=null;}catch(Exception e){}
            this.cargarEntidad();
            
            return this;
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception(e.toString());
        }finally{
//            try {conn.close();} catch (Exception e) {}
            try {pstmt1.close();} catch (Exception e) {}
            try {rs.close();} catch (Exception e) {}
        }
    }
    public Collection ejbFindAll() throws Exception {
        ArrayList monedas = new ArrayList();
        ResultSet rs = null;
        try {
            conn = IGBean.getMetricaDB();//getConexion("METRICADB");
            pstmt1 = conn.prepareStatement( "SELECT ID, NOMBRE FROM MONEDAS ");
            rs = pstmt1.executeQuery();            
            while (rs.next()) {
                MonedaPK m=new MonedaPK(rs.getString("NOMBRE"));
                m.setIdInterna(rs.getInt("ID"));
                monedas.add(m);
            }
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                pstmt1.close();
            } catch (SQLException e) {
            }
//            try {
//                conn.close();
//            } catch (SQLException e) {
//            }
            try {
                rs.close();
            } catch (SQLException e) {
            }
        }
        return monedas;
    }
    
}

